package com.fhb.java.d20250609.动态代理;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.junit.Test;

import java.lang.reflect.Method;
import java.math.BigDecimal;

/**
 * @author abao
 * @Description TODO
 * @createTime 2025-06-09 17:58:00
 */
public class 动态代理cglib测试 {

    static class PayService{

//        private String flag;
//
//        public PayService(String flag) {
//            this.flag = flag;
//        }

        public String pay(String userName, BigDecimal amount){
            System.out.println(String.format("userName:%s paid amount:%s",userName, amount));
            return "pay";
        }

        public String pay2(){
            System.out.println("pay2");
            return "pay2";
        }
    }

    @Test
    public void test() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(PayService.class); // 设置父类
        enhancer.setCallback(new MethodInterceptor() { // 创建拦截器
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("Before method call."); // 方法调用前执行
                Object result = proxy.invokeSuper(obj, args); // 调用原始方法
                System.out.println("After method call."); // 方法调用后执行
                return result; // 返回原始方法的返回值
            }
        });

//        PayService payService = (PayService) enhancer.create(
//                new Class[]{String.class},  // 构造参数类型数组
//                new Object[]{"CGLIB"} // 构造参数值数组
//        ); // 创建代理对象
        PayService payService = (PayService) enhancer.create(); // 创建代理对象
        payService.pay("marry", BigDecimal.TEN); // 调用代理的方法，将触发拦截器逻辑
//        payService.pay2();
    }
}
